﻿using System;
using System.Net;
using System.Net.Mail;
using System.Text;
using Rendiciones.Web.infraestructura;
using Rendiciones.Logica.Enumeradores;
using System.Linq;

namespace Rendiciones.Web
{
    public partial class IniciarSesion : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LimpiarErrores(pnlLogin);
                EstadoInicial();
                mpeLogin.Show();
            }
        }

        protected void BtnIniciarSesionClick(object sender, EventArgs e)
        {
            try
            {
                LimpiarErrores(pnlLogin);
                if (string.IsNullOrEmpty(txtNombreUsuario.Text) || string.IsNullOrEmpty(txtContrasena.Text)) { MuestraMensajeError(pnlLogin, "<b>Error: </b>Nombre usuario o contraseña incorrecta"); return; }
                var usuario = Modulos.Rendiciones.Usuarios.ObtenerUsuarioPorUserPassword(txtNombreUsuario.Text.Trim(), txtContrasena.Text.Trim());
                if (usuario == null) { MuestraMensajeError(pnlLogin, "<b>Error: </b>Nombre usuario o contraseña incorrecta"); return; }

                UsuarioConectado = usuario;
                Session["usuario"] = usuario;

                Session.Timeout = Configuracion.SesionTimeOut;
                if (chkRecordar.Checked)
                    Session.Timeout = 1440;

                var rol = usuario.Roles.OrderByDescending(r => r.IdRol).FirstOrDefault();
                if (rol == null)
                    return;

                usuario.IdRolSeleccionado = rol.IdRol;
                switch (rol.IdRol)
                {
                    case 1: Response.Redirect("~/Custodio/Menu.aspx"); break;
                    case 2: Response.Redirect("~/Administrador/Menu.aspx"); break;
                    case 3: Response.Redirect("~/Gerente/Menu.aspx"); break;
                    case 4: Response.Redirect("~/Contador/Menu.aspx"); break;
                    case 5: Response.Redirect("~/Tesoreria/Menu.aspx"); break;
                    case 6: Response.Redirect("~/Mantenedores/Menu.aspx"); break;
                }
            }
            catch (Exception exception)
            {
                MuestraMensajeError(pnlLogin, "<strong>Error:</strong> " + exception.Message);
            }
        }

        protected void LbContraseñaOlvidadaClick(object sender, EventArgs e)
        {
            MostrarRecuperar();
        }

        private void MostrarIniciar()
        {
            LimpiarErrores(pnlLogin);
            lblTitulo.Text = "Iniciar Sesión";
            tblRecuperar.Visible = false;
            tblIniciar.Visible = true;
            txtNombreUsuario.Focus();
        }

        private void EstadoInicial()
        {
            txtNombreUsuario.Text = "";
            txtContrasena.Text = "";
            txtRecuperar.Text = "";
        }

        private void MostrarRecuperar()
        {
            LimpiarErrores(pnlLogin);
            lblTitulo.Text = "Recuperar contraseña";
            tblRecuperar.Visible = true;
            tblIniciar.Visible = false;
            txtRecuperar.Focus();
        }

        protected void BtnVolverClick(object sender, EventArgs e)
        {
            LimpiarErrores(pnlLogin);
            MostrarIniciar();
        }

        protected void BtnEnviarClick(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtRecuperar.Text)) { MuestraMensajeError(pnlLogin, "<b>Error: </b>No se ingreso nombre de usuario o correo electrónico"); return; }
            try
            {
                var usuario = Modulos.Rendiciones.Usuarios.Leer(txtRecuperar.Text);

                var body = new StringBuilder();

                body.Append("<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>");
                body.Append("<html xmlns='http://www.w3.org/1999/xhtml'>");
                body.Append("<head>");
                body.Append("    <title>Clave de Acceso - Rendiciones Delta</title>");
                body.Append("</head>");
                body.Append("<body style='font-size:14px; font-family:Verdana;'>");
                body.Append("    <table width='800px'>");
                body.Append("        <tr>");
                body.Append("            <td  colspan='2'>");
                body.Append("               Este mensaje ha sido generado por Rendiciones Delta. Favor no responder");
                body.Append("            </td>");
                body.Append("        </tr>");
                body.Append("        <tr>");
                body.Append("            <td  colspan='2'>");
                body.Append("                Se ha realizado la recuperación de su clave de acceso.");
                body.Append("            </td>");
                body.Append("        </tr>");
                body.Append("        <tr>");
                body.Append("            <td  colspan='2'>");
                body.Append("              Su nueva clave de acceso es:");
                body.Append("            </td>");
                body.Append("        </tr>");
                body.Append("        <tr>");
                body.Append("            <td  colspan='2'><b>");
                body.Append(String.Format("                {0}", usuario.Password));
                body.Append("            </td></b>");
                body.Append("        </tr>");
                body.Append("        <tr>");
                body.Append("            <td  colspan='2'>");
                body.Append("                Saludos,");
                body.Append("            </td>");
                body.Append("        </tr>");
                body.Append("        <tr>");
                body.Append("            <td  colspan='2'></br></br>");
                body.Append("                Rendiciones Delta");
                body.Append("            </td>");
                body.Append("        </tr>");
                body.Append("    </table>");
                body.Append("</body>");
                body.Append("</html>");

                var from = Configuracion.ServerSmtpMail;
                var to = usuario.Email;
                const string subject = "Clave de Acceso - Rendiciones Delta";
                var mail = new MailMessage(from, to, subject, body.ToString()) { IsBodyHtml = true };
                var smtp = new SmtpClient(Configuracion.ServerSmtpServer);
                if (!string.IsNullOrEmpty(Configuracion.ServerSmptUser))
                    smtp.Credentials = new NetworkCredential(Configuracion.ServerSmptUser, Configuracion.ServerSmptPassword);
                smtp.Send(mail);

                EstadoInicial();
                txtNombreUsuario.Text = usuario.Username;
                MostrarIniciar();
                MuestraMensajeOk(pnlLogin, "Se ha enviado un correo electrónico a " + to + " con su nueva contraseña, favor revise su casilla de entrada");
                txtContrasena.Focus();
            }
            catch(Exception exception)
            {
                MuestraMensajeError(pnlLogin, "<b>Error Interno: </b>" + exception.Message + ". Pongase en contacto con el administrador del sistema");
            }
        }
    }
}